
#include "capturer.hpp"

void CameraCap::connect(){
    int apiID = cv::CAP_ANY;
    cap.open(url, apiID);
    if(!cap.isOpened()){
        std::cout << "ERROR! Unable to open camera\n" << std::endl;
    }
}

CameraCap::CameraCap(std::string user, std::string passwd, std::string ip){
    url = "rtsp://" + user + ":" + passwd + "@" + ip + ":554/h264/ch1/main/av_stream";
    connect();
}    
CameraCap::~CameraCap(){
    cap.release();
}    
bool CameraCap::getOneFrame(cv::Mat& frame){
    if(cap.isOpened()){
        cap.read(frame);
        if(frame.empty()){
            cap.release();
            connect();
            return false;
        }
        return true;
    }else{
        connect();
        return false;
    }
}


// std::vector<cv::Mat> qData;
// void testFunc(){
//     cv::Mat frame, frameResized;
//     while(1){
//         if(!qData.empty()){
//             frame = qData.back().clone();//
//             if(qData.size() > 3){
//                 qData.erase(qData.begin()+0);
//             }
//             cv::Size frameSize(640,360);
//             cv::resize(frame, frameResized, frameSize);
//             // std::cout << frameResized.cols << "," << frameResized.rows << std::endl;
//             cv::imshow("Live", frameResized);
//             cv::waitKey(1);
//             // std::cout << qData.size() << std::endl;
//             // qData.pop_back();
//         }
//     }
//     std::cout << "hello thread" << std::endl;
// }

// int main(void){
//     std::string ip = "192.168.6.190";
//     std::string user = "admin";
//     std::string password = "hxzh2019";
//     CameraCap test(user,password,ip);

//     std::thread thread0(testFunc);
    
    
//     bool ret;
//     struct timeval startTime, stopTime;
//     long elapsed;


//     cv::Mat frame, frameResized;
//     for(int i=0; i<10000;i++){
//         gettimeofday(&startTime, NULL);

//         ret = test.getOneFrame(frame);
//         if(!ret){
//             continue;
//         }

//         if(qData.size() <= 3){
//             qData.push_back(frame.clone());
//         }
//         // if(qData.size() > 3){
//         //     qData.erase(qData.begin()+0);
//         // }


//         gettimeofday(&stopTime, NULL);
//         elapsed = (stopTime.tv_sec-startTime.tv_sec) * 1000000 + (stopTime.tv_usec - startTime.tv_usec);
//         // std::cout << "0: " << elapsed << "us" << std::endl;
//         gettimeofday(&startTime, NULL);

//         std::cout << i << std::endl;
//     }
//     thread0.join();

//     printf("hello world\n");    


//     return 0;
// }